package org.example.camundaengine.controllers;

import jakarta.annotation.Resource;
import org.camunda.bpm.engine.IdentityService;
import org.camunda.bpm.engine.RuntimeService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description:
 */

@RestController
@RequestMapping("/leave")
public class UserTaskController {
    /**
     * 用户、组、租户等相关
     */
    @Resource
    private IdentityService identityService;

    /**
     * 流程实例操作
     */
    @Resource
    private RuntimeService runtimeService;

    /**
     * 启动请假流程实例
     *
     * @param user
     * @param processKey
     */
    @GetMapping("/start/{user}/{processKey}")
    public void startProcess(@PathVariable("user") String user, @PathVariable("processKey") String processKey) {
        /**
         * 表：act_id_user
         *
         * 在此处我们设置发起人信息，对象存储在了如下类型中
         * ThreadLocal<Authentication> currentAuthentication = new ThreadLocal();
         * 因此线程之间是隔离的，不会造成混用情况
         */
        identityService.setAuthenticatedUserId(user);
        /**
         * 表：
         * act_re_procdef BPMN定义
         * act_re_deployment流程部署信息
         * act_ge_bytearray 部署的实际内容
         * 开启一个流程实例
         *
         * 开启后的实例存放于
         * 表：act_run_execution 以及  act_run_task
         * act_run_execution BPMN运行时记录，包含到那个节点了
         * act_run_task 流程总的记录，记录了执行到哪个节点了，指派给了谁等信息
         * 多个版本，默认使用最新版本
         * 启动加入流程变量时，需要加入startProcessInstanceByKey中
         *
         * 流程的ID: "Process_user_task"
         */
        runtimeService.startProcessInstanceByKey(processKey);
    }
}
